package com.yutian.socketbio;


import com.yutian.socketbio.client.Client;
import com.yutian.socketbio.server.CommonServer;
import com.yutian.socketbio.server.HttpServer;
import com.yutian.socketbio.server.SimpleServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Scanner;

public class App {
    private static Logger log = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        String target = "SimpleServer";
        if(null != args && 0 < args.length){
            target = args[0];
        }
        log.info("开始启动服务:{}", target);
        // 从 Java SE 7 开始，switch 支持字符串 String 类型了，同时 case 标签必须为字符串常量或字面量。
        switch (target) {
            case "SimpleServer":
                log.info("模拟串行BIO服务器，一个线程服务所有请求。阻塞等待客户端连接中...");
                SimpleServer.listen(9988);
                break;
            case "HttpServer":
                log.info("模拟Web服务器，只接受一个请求。阻塞等待客户端连接中...");
                HttpServer.listen(9988);
                break;
            case "CommonServer":
                log.info("模拟并行BIO服务器，一个线程服务一个请求。阻塞等待客户端连接中...");
                CommonServer.listen(9988);
                break;
            case "Client":
                int num = 1;
                if(null != args && 1 < args.length){
                    num = Integer.valueOf(args[1]);
                }
                // 多线程，非阻塞
                createClient(num);
                // 设置等待退出指令，避免退出
                waitExit();
                break;
            default : //可选
                log.info("不支持的服务:{}", target);
        }
    }

    /**
     * 设置等待退出指令
     */
    private static void waitExit() {
        Scanner scan = new Scanner(System.in);
        System.out.println("输入exit结束程序：");
        while (scan.hasNextLine()) {
            // This method may block while waiting for input
            // 判断是否还有输入
            String inputString = scan.nextLine();
            System.out.println("输入为： ["+ inputString + "]");
            if("exit".equals(inputString)){
                System.out.println("程序结束!");
                System.exit(0);
            }
        }
    }

    public static void createClient(int num) {
        for(int i=0; i<num; i++){
            final int idx = i;
            new Thread() {
                public void run() {
                    Client.connectToServer("127.0.0.1", 9988, "你好，我是来自client["+idx+"]的问候！");
                }
            }.start();
        }
    }
}
